name: Python CI

on:
    push:
        branches: [main]
    pull_request:
        paths:
            - "src/**"
            - "tests/**"
            - "tutorials/**"
            - "pyproject.toml"
            - "packages/**"
    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:

concurrency:
    group: test-python-${{ github.head_ref }}
    cancel-in-progress: true

env:
    pip-version: 23.1.2
    OPENAI_API_KEY: "sk-fake-openai-key" # fake openai key so that llama_index doesn't download huggingface embeddings

jobs:
    changes:
        name: Filter Changes
        runs-on: ubuntu-latest
        outputs:
            phoenix: ${{ steps.filter.outputs.phoenix }}
            packages: ${{ steps.filter.outputs.packages }}
            phoenix_evals: ${{ steps.filter.outputs.phoenix_evals }}
        steps:
            - uses: actions/checkout@v4
            - uses: dorny/paths-filter@v3
              id: filter
              with:
                  filters: |
                      phoenix:
                          - "src/**"
                          - "tests/**"
                          - "tutorials/**"
                          - "pyproject.toml"
                      packages:
                          - "packages/**"
                      phoenix_evals:
                          - "packages/phoenix-evals/**"

    tox:
        name: Tox
        runs-on: ubuntu-latest
        needs: changes
        if: ${{ needs.changes.outputs.packages == 'true' }}
        steps:
            - uses: actions/checkout@v4
            - uses: actions/setup-python@v5
              with:
                  python-version: |
                      3.8
                      3.12
            - run: pip install tox==4.12.1
            - run: tox run-parallel --parallel-no-spinner -e py38-ci-phoenix_evals,py311-ci-phoenix_evals
              if: ${{ needs.changes.outputs.phoenix_evals == 'true' }}

    lint:
        name: Lint Phoenix
        runs-on: ubuntu-latest
        needs: changes
        if: ${{ needs.changes.outputs.phoenix == 'true' }}
        steps:
            - name: Checkout Repository
              uses: actions/checkout@v3
            - name: Set up python 3.8
              uses: actions/setup-python@v4
              with:
                  python-version: "3.8"
            - name: Install dependencies
              run: |
                  python -m pip install --upgrade pip==${{ env.pip-version }}
                  pip install hatch
            - name: Proto codegen
              run: |
                  hatch run proto:recompile
                  git diff --exit-code
            - name: Check format
              run: |
                  hatch run style:check
            - name: Check types
              run: |
                  hatch run type:check
            - name: Gql codegen
              run: |
                  hatch run gql:build
                  git diff --exit-code
            - name: Check notebooks have cleaned output and metadata
              run: |
                  hatch run notebooks:clean
                  git diff --exit-code

    test:
        name: Test Phoenix
        runs-on: ${{ matrix.os }}
        needs: changes
        if: ${{ needs.changes.outputs.phoenix == 'true' }}
        strategy:
            matrix:
                os: [macos-latest, windows-latest, ubuntu-latest]
                python-version: ["3.8"]
        steps:
            - name: Checkout Repository
              uses: actions/checkout@v3
            - name: Set up python ${{ matrix.python-version }}
              uses: actions/setup-python@v4
              with:
                  python-version: ${{ matrix.python-version }}
            - name: Install dependencies
              run: |
                  python -m pip install --upgrade pip==${{ env.pip-version }}
                  pip install hatch
            - name: Run tests
              run: |
                  hatch run test:tests
